Multi Fragment 여러 Fragment를 만들어서 하나의 Activity 안에 갈아끼우는 방식으로 진행해보겠습니다.
프로젝트 만들기 프래그먼트를 실습할 프로젝트를 생성하겠습니다. activity_main.xml 레이아웃을 수정합니다.
Fragment 만들기 FirstFragment 라는 이름으로 프래그먼트를 만들겠습니다.
fragment_first.xml 레이아웃을 수정합니다.
Activity에서 Fragment 관리하기 Activity 에서는 프래그먼트를 관리하는 역할만합니다. v4 허니콤버전입니다. v7 아이스크림샌드위치 버전입니다. Fragment는 허니콤 버전(v4)를 이용하겠습니다. package com.ktds.cocomo.mymultifragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private Fragment firstFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstFragment = new FirstFragment();
setDefaultFragment();
}
public void setDefaultFragment() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.container, firstFragment);
transaction.commit();
}
}
transaction에서 add는 두번째 것을 사용합니다.
FirstFragment 수정 아래 코드와 같이 수정합니다. package com.ktds.cocomo.mymultifragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FirstFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public FirstFragment() {
}
public static FirstFragment newInstance(String param1, String param2) {
FirstFragment fragment = new FirstFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_first, container, false);
}
}
결과
두번째 Fragment를 만듭니다. SecondFragment 이름으로 만듭니다.
SecondFragment.java 파일을 아래와 같이 수정합니다. package com.ktds.cocomo.mymultifragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SecondFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public SecondFragment() {
}
public static SecondFragment newInstance(String param1, String param2) {
SecondFragment fragment = new SecondFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_second, container, false);
}
}
MainActivity에서 secondFragment 정의 MainActivity에서 SecondFragment 객체를 만들어줍니다. private Fragment firstFragment;
private Fragment secondFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstFragment = new FirstFragment();
secondFragment = new SecondFragment();
setDefaultFragment();
}
Fragment 바꾸기 MainActivity에서 FirstFragment를 띄워주고 FirstFragment에 버튼을 하나 둔 뒤 버튼을 누르면 Activity의 메소드(replaceFragment)를 통해 SecondFragment로 갈아끼워보겠습니다.
MainActivity에 replaceFragment 메소드를 추가합니다.
public void replaceFragment(int fragmentId) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if ( fragmentId == 1 ) {
transaction.replace(R.id.container, firstFragment);
} else if ( fragmentId == 2 ) {
transaction.replace(R.id.container, secondFragment);
}
transaction.commit();
}
fragment_first.xml 레이아웃에 다음 Fragment로 이동할 수 있는 버튼을 추가합니다.
FirstFragment에서 onCreateView 메소드를 수정합니다. private Button nextFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
nextFragment = (Button) view.findViewById(R.id.nextFragment);
nextFragment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((FragmentReplaceable) getActivity()).replaceFragment(2);
}
});
return view;
}
인터페이스 생성합니다. public interface FragmentReplaceable extends Serializable {
public void replaceFragment(int fragmentId);
}
MainActivity에서 FragmentReplaceable 인터페이스를 implement합니다. public class MainActivity extends AppCompatActivity implements FragmentReplaceable
replaceFragment 메소드에 @Override 적어줍니다.
@Override
public void replaceFragment(int fragmentId)
replaceFragment 메소드에 뒤로가기 기능을 추가합니다.
transaction.addToBackStack(null);
세번째 프래그먼트 만들기 위와 같은 방식으로 세번째 Fragment도 만들겠습니다. 세번째 프래그먼트에선 버튼을 누르면 다시 첫번째 프래그먼트로 이동하도록 했습니다. 결과 화면입니다.
첫번째 프래그먼트에서 버튼을 누르면 두번째 프래그먼트로 이동합니다.
두번째 프래그먼트에서 버튼을 누르면 세번째 프래그먼트로 이동합니다.
세번째 프래그먼트에서 버튼을 누르면 다시 첫 프래그먼트로 이동합니다.
Fragment 간의 parameter 전달하기 Fragment 간의 파라미터 전달하는 방법은 github.com/cocomo1316/Android 에서 My Multi Fragment 폴더에 코드가 있습니다. 이상으로 멀티 프래그먼트를 마치겠습니다. |